<?php
namespace app\controllers;
use Yii;
use app\base\Controller;
use app\components\mq\MqComponent;
use app\models\Template;
use app\components\redis\RedisLock;
use app\components\FileLock;
use app\components\redis\RedisMarketingEmail;

class CrontabSystemEmailController extends Controller
{
    public $enableCsrfValidation = false; 
    
    /*
     * 循环各网站消费系统邮件数据
     */
    public function actionIndex()
    {
        $redis = new RedisMarketingEmail();
        //添加同一站点文件锁定
        $redisLock = new RedisLock($redis, "send_sys_mail", 300);//同一网站两次同步数据请求间隔需大于5分钟
        
        if ($redisLock->translock() === false) {
            
            $this->writeLog('有请求在处理中，拒绝该请求！');
            echo '有请求在处理中，拒绝该请求！';
            exit;
        }
        
        $webArr = Yii::$app->params['sites']['sys_email']['web_config'];
        
        if($webArr)
        {
            $hostName = Yii::$app->request->getHostName();
            foreach($webArr as $site_name => $site_config)
            {
                $url = $hostName."/crontab-system-email/send-mail?site=sys_email&site_name=$site_name&mq_wait_timeout=1";
                $res = $this->Curl($url);
                if($res)
                {
                    $msg = "site_name:$site_name".PHP_EOL.$res;
                    $this->writeLog($msg);
                }
                
            }
        }
    }
    /*
     * 执行请求操作
     */
    private function Curl($url)
    {
            // 创建一个新cURL资源
            $ch = curl_init();

            // 设置URL和相应的选项
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_HEADER, false); 
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_TIMEOUT, 10);
            // 抓取URL并把它传递给浏览器
            $result = curl_exec($ch);

            //关闭cURL资源，并且释放系统资源
            curl_close($ch);
            return $result;

    }
     /**
     *
     * @param $msg
     */
    private function writeLog($msg)
    {
        $date = yii::$app->bjTime->date("Y-m-d H:i:s");
        $today = yii::$app->bjTime->date("Ymd");
        $dir = yii::$app->getRuntimePath() . "/logs/sysmq/" . yii::$app->bjTime->date("Ym");
        if (!is_dir($dir)) {
            mkdir($dir, 0777, true);
        }
        $filePath = $dir . "/sysmq_{$today}.log";
        $msg = "[{$date}] $msg" . PHP_EOL;
        file_put_contents($filePath, $msg, FILE_APPEND);
    }

    /**
     * 发送邮件相关
     */
    public function actionSendMail()
    {
      
        // 获取网站
        $mothod = strtolower(Yii::$app->request->getMethod());
        $site_name = Yii::$app->request->$mothod('site_name');
        if (!$site_name) {
            echo '必须要传网站名';
            exit;
        } 
        
        $redis = new RedisMarketingEmail();
        //添加同一站点文件锁定
        $redisLock = new RedisLock($redis, "send_sys_mail".$site_name, 300);//同一网站两次同步数据请求间隔需大于5分钟
        
        if ($redisLock->translock() === false) {
            
            $this->writeLog('有请求在处理中，拒绝该请求！');
            echo '有请求在处理中，拒绝该请求！';
            exit;
        }
        // 获取队列名称
        $queue_name = Yii::$app->params['sites']['sys_email']['web_config'][$site_name]['queue_name'];
        
        // 发送邮件
        
        $returnData = MqComponent::sendMailSys($queue_name);
       //return $returnData;
        //var_dump($returnData);
        $msg = "site_name:$site_name,queue:$queue_name".PHP_EOL.($returnData ? var_export($returnData,true) : "");
        if ($returnData) {
            $this->writeLog($msg);
        }
        echo $msg;
        
        
    }
    
    /*
     *  EDM消费GB发送用户相关邮件数据
     */
    public function actionSendGbUserMail() {
        
        set_time_limit(0);
      
       // 获取网站
        $mothod = strtolower(Yii::$app->request->getMethod());
        $site_name = Yii::$app->request->$mothod('site_name');
        $process = Yii::$app->request->$mothod('process');
        $process = $process ? (int)$process : 1;
        
        if (!$site_name) {
            echo '必须要传网站名';
            exit;
        }
        
//        $redis = new RedisMarketingEmail();
//        // 添加同一站点请求锁定
//        $redisLock = new RedisLock($redis, "send_gb_user_sys_mail".$process, 3600);// 两次同步数据请求间隔需大于1小时 
//        
//        // 模拟每秒钟执行
//        for($i = 0; $i < 60; $i++) {
//            if ($redisLock->translock() === false) {
//                
//                // 延迟一秒
//                sleep(1);
//                $nolock = false;
//                continue;
//            } else {
//                $nolock = true;
//                break;
//            }
//            
//        }
        
        
        $lock = new FileLock("send_gb_user_sys_mail".$process);
       
        for($i = 0; $i < 60; $i++) {
            if ($lock->tryLock() === false) {
                 // 延迟一秒
                sleep(1);
                $nolock = false;
                continue;
            } else {
                $nolock = true;
                break;
            }
        }
        
        
        if(!$nolock) {
//            $this->writeLog('action:SendGbUserMail;process:'.$process.';有请求在处理中，拒绝该请求！');
            echo 'action:SendGbUserMail;process:'.$process.';有请求在处理中，拒绝该请求！';
            exit;
        }
        
        
        // 获取队列名称
        $queue_name = Yii::$app->params['sites']['sys_email']['web_config'][$site_name]['user_queue_name'];
        
        if(!$queue_name) {
            echo '队列不存在！';
            exit;
        }
        // 发送邮件

        $returnData = MqComponent::sendGbMailSys($queue_name);
        $msg = "site_name:$site_name,queue:$queue_name".PHP_EOL.($returnData ? var_export($returnData,true) : "");
        
        if($returnData) {
            $this->writeLog($msg);
        }
        echo $msg;
    }
   
    
    /*
     *  EDM消费GB发送用户相关邮件数据
     */
    public function actionNewSendGbUserMail() {
        
        set_time_limit(0);
      
       // 获取网站
        $mothod = strtolower(Yii::$app->request->getMethod());
        $site_name = Yii::$app->request->$mothod('site_name');
        $process = Yii::$app->request->$mothod('process');
        $process = $process ? (int)$process : 1;
        
        if (!$site_name) {
            echo '必须要传网站名';
            exit;
        }
        
//        $redis = new RedisMarketingEmail();
//        // 添加同一站点请求锁定
//        $redisLock = new RedisLock($redis, "send_gb_user_sys_mail".$process, 3600);// 两次同步数据请求间隔需大于1小时 
//        
//        // 模拟每秒钟执行
//        for($i = 0; $i < 60; $i++) {
//            if ($redisLock->translock() === false) {
//                
//                // 延迟一秒
//                sleep(1);
//                $nolock = false;
//                continue;
//            } else {
//                $nolock = true;
//                break;
//            }
//            
//        }
        
        
        $lock = new FileLock("new_send_gb_user_sys_mail".$process);
       
        for($i = 0; $i < 60; $i++) {
            if ($lock->tryLock() === false) {
                 // 延迟一秒
                sleep(1);
                $nolock = false;
                continue;
            } else {
                $nolock = true;
                break;
            }
        }
        
        
        if(!$nolock) {
//            $this->writeLog('action:SendGbUserMail;process:'.$process.';有请求在处理中，拒绝该请求！');
            echo 'action:NewSendGbUserMail;process:'.$process.';有请求在处理中，拒绝该请求！';
            exit;
        }
        
        
        // 获取队列名称
        $queue_name = Yii::$app->params['sites']['sys_email']['web_config'][$site_name]['new_user_queue_name'];
        
        if(!$queue_name) {
            echo '队列不存在！';
            exit;
        }
        // 发送邮件

        $returnData = MqComponent::newSendGbMailSys($queue_name);
        $msg = "site_name:$site_name,queue:$queue_name".PHP_EOL.($returnData ? var_export($returnData,true) : "");

        if($returnData) {
            $this->writeLog($msg);
        }
        echo $msg;
    }
    
     /*
     *  EDM消费GB发送订单相关邮件数据
     */
    public function actionSendGbOrderMail() {
        
        set_time_limit(0);
        // 获取网站
        $mothod = strtolower(Yii::$app->request->getMethod());
        $site_name = Yii::$app->request->$mothod('site_name');
        $process = Yii::$app->request->$mothod('process');
        $process = $process ? (int)$process : 1;
        if (!$site_name) {
            echo '必须要传网站名';
            exit;
        } 
        
//        $redis = new RedisMarketingEmail();
//        // 添加同一站点请求锁定
//        $redisLock = new RedisLock($redis, "send_gb_order_sys_mail".$process, 300);// 两次同步数据请求间隔需大于5分钟
//
//        if ($redisLock->translock() === false) {
//            
//            $this->writeLog('有请求在处理中，拒绝该请求！');
//            echo '有请求在处理中，拒绝该请求！';
//            exit;
//        }
        
        $lock = new FileLock("send_gb_order_sys_mail".$process);
        for($i = 0; $i < 60; $i++) {
            if ($lock->tryLock() === false) {
                 // 延迟一秒
                sleep(1);
                $nolock = false;
                continue;
            } else {
                $nolock = true;
                break;
            }
        }
        
        if(!$nolock) {
//            $this->writeLog('action:SendGbUserMail;process:'.$process.';有请求在处理中，拒绝该请求！');
            echo 'action:SendGbOrderMail;process:'.$process.';有请求在处理中，拒绝该请求！';
            exit;
        }
        
        // 获取队列名称
        $queue_name = Yii::$app->params['sites']['sys_email']['web_config'][$site_name]['order_queue_name'];
        if(!$queue_name) {
            echo '队列不存在！';
            exit;
        }
        // 发送邮件
        
        $returnData = MqComponent::sendGbMailSys($queue_name);
       //return $returnData;
        //var_dump($returnData);
       
        $msg = "site_name:$site_name,queue:$queue_name".PHP_EOL.($returnData ? var_export($returnData,true) : "");
        if($returnData) {
            $this->writeLog($msg);
        }
        echo $msg;
        
        
    }
    
    
    /*
     *  EDM消费GB发送订单相关邮件数据
     */
    public function actionNewSendGbOrderMail() {
        
        set_time_limit(0);
        
        ini_set('memory_limit', '1024M');
        // 获取网站
        $mothod = strtolower(Yii::$app->request->getMethod());
        $site_name = Yii::$app->request->$mothod('site_name');
        $process = Yii::$app->request->$mothod('process');
        $process = $process ? (int)$process : 1;
        if (!$site_name) {
            echo '必须要传网站名';
            exit;
        } 
        
//        $redis = new RedisMarketingEmail();
//        // 添加同一站点请求锁定
//        $redisLock = new RedisLock($redis, "send_gb_order_sys_mail".$process, 300);// 两次同步数据请求间隔需大于5分钟
//
//        if ($redisLock->translock() === false) {
//            
//            $this->writeLog('有请求在处理中，拒绝该请求！');
//            echo '有请求在处理中，拒绝该请求！';
//            exit;
//        }
        
        $lock = new FileLock("new_send_gb_order_sys_mail".$process);
        for($i = 0; $i < 60; $i++) {
            if ($lock->tryLock() === false) {
                 // 延迟一秒
                sleep(1);
                $nolock = false;
                continue;
            } else {
                $nolock = true;
                break;
            }
        }
        
        if(!$nolock) {
//            $this->writeLog('action:SendGbUserMail;process:'.$process.';有请求在处理中，拒绝该请求！');
            echo 'action:NewSendGbOrderMail;process:'.$process.';有请求在处理中，拒绝该请求！';
            exit;
        }
        
        // 获取队列名称
        $queue_name = Yii::$app->params['sites']['sys_email']['web_config'][$site_name]['new_order_queue_name'];
        if(!$queue_name) {
            echo '队列不存在！';
            exit;
        }
        // 发送邮件
        
        $returnData = MqComponent::newSendGbMailSys($queue_name);
       //return $returnData;
        //var_dump($returnData);
       
        $msg = "site_name:$site_name,queue:$queue_name".PHP_EOL.($returnData ? var_export($returnData,true) : "");
        if($returnData) {
            $this->writeLog($msg);
        }
        echo $msg;
        
        
    }
    
     /*
     *  EDM消费GB发送商品相关邮件数据
     */
    public function actionSendGbGoodsMail() {
        set_time_limit(0);
        // 获取网站
        $mothod = strtolower(Yii::$app->request->getMethod());
        $site_name = Yii::$app->request->$mothod('site_name');
        $process = Yii::$app->request->$mothod('process');
        $process = $process ? (int)$process : 1;
        if (!$site_name) {
            echo '必须要传网站名';
            exit;
        } 
        
//        $redis = new RedisMarketingEmail();
//        // 添加同一站点请求锁定
//        $redisLock = new RedisLock($redis, "send_gb_goods_sys_mail".$process, 300);// 两次同步数据请求间隔需大于5分钟
//
//        if ($redisLock->translock() === false) {
//            
//            $this->writeLog('有请求在处理中，拒绝该请求！');
//            echo '有请求在处理中，拒绝该请求！';
//            exit;
//        }
        
        $lock = new FileLock("send_gb_goods_sys_mail".$process);
       
        if($lock->tryLock() === false) {
//            $this->writeLog('action:SendGbUserMail;process:'.$process.';有请求在处理中，拒绝该请求！');
            echo 'action:SendGbGoodsMail;process:'.$process.';有请求在处理中，拒绝该请求！';
            exit;
        }
        
        // 获取队列名称
        $queue_name = Yii::$app->params['sites']['sys_email']['web_config'][$site_name]['goods_queue_name'];
        if(!$queue_name) {
            echo '队列不存在！';
            exit;
        }
        // 发送邮件
        
        $returnData = MqComponent::sendGbMailSys($queue_name);
       //return $returnData;
        //var_dump($returnData);
       
        $msg = "site_name:$site_name,queue:$queue_name".PHP_EOL.($returnData ? var_export($returnData,true) : "");
        if($returnData) {
            $this->writeLog($msg);
        }
        echo $msg;
        
        
    }
    
     /*
     *  EDM消费GB发送商品相关邮件数据
     */
    public function actionNewSendGbGoodsMail() {
        set_time_limit(0);
        // 获取网站
        $mothod = strtolower(Yii::$app->request->getMethod());
        $site_name = Yii::$app->request->$mothod('site_name');
        $process = Yii::$app->request->$mothod('process');
        $process = $process ? (int)$process : 1;
        if (!$site_name) {
            echo '必须要传网站名';
            exit;
        } 
        
//        $redis = new RedisMarketingEmail();
//        // 添加同一站点请求锁定
//        $redisLock = new RedisLock($redis, "send_gb_goods_sys_mail".$process, 300);// 两次同步数据请求间隔需大于5分钟
//
//        if ($redisLock->translock() === false) {
//            
//            $this->writeLog('有请求在处理中，拒绝该请求！');
//            echo '有请求在处理中，拒绝该请求！';
//            exit;
//        }
        
        $lock = new FileLock("new_send_gb_goods_sys_mail".$process);
       
        if($lock->tryLock() === false) {
//            $this->writeLog('action:SendGbUserMail;process:'.$process.';有请求在处理中，拒绝该请求！');
            echo 'action:NewSendGbGoodsMail;process:'.$process.';有请求在处理中，拒绝该请求！';
            exit;
        }
        
        // 获取队列名称
        $queue_name = Yii::$app->params['sites']['sys_email']['web_config'][$site_name]['new_goods_queue_name'];
        if(!$queue_name) {
            echo '队列不存在！';
            exit;
        }
        // 发送邮件
        
        $returnData = MqComponent::newSendGbMailSys($queue_name);
       //return $returnData;
        //var_dump($returnData);
       
        $msg = "site_name:$site_name,queue:$queue_name".PHP_EOL.($returnData ? var_export($returnData,true) : "");
        if($returnData) {
            $this->writeLog($msg);
        }
        echo $msg;
        
        
    }
    
    
    /*
     *  EDM消费GB发送评论相关邮件数据
     *  liugang| 2018-3-13
     */
    public function actionSendGbReviewMail() {
        set_time_limit(0);
        // 获取网站
        $mothod = strtolower(Yii::$app->request->getMethod());
        $site_name = Yii::$app->request->$mothod('site_name');
        $process = Yii::$app->request->$mothod('process');
        $process = $process ? (int)$process : 1;
        if (!$site_name) {
            echo '必须要传网站名';
            exit;
        } 

        
        $lock = new FileLock("send_gb_review_sys_mail".$process);
       
        if($lock->tryLock() === false) {
//            $this->writeLog('action:SendGbUserMail;process:'.$process.';有请求在处理中，拒绝该请求！');
            echo 'action:SendGbReviewMail;process:'.$process.';有请求在处理中，拒绝该请求！';
            exit;
        }
        
        // 获取队列名称
        $queue_name = Yii::$app->params['sites']['sys_email']['web_config'][$site_name]['review_queue_name'];
        if(!$queue_name) {
            echo '队列不存在！';
            exit;
        }
        // 发送邮件
        $returnData = MqComponent::sendGbMailSys($queue_name);
        
       //return $returnData;
        //var_dump($returnData);
       
        $msg = "site_name:$site_name,queue:$queue_name".PHP_EOL.($returnData ? var_export($returnData,true) : "");
        if($returnData) {
            $this->writeLog($msg);
        }
        echo $msg;
        
        
    }
    
    /*
     *  EDM消费GB发送评论相关邮件数据
     *  liugang| 2018-3-13
     */
    public function actionNewSendGbReviewMail() {
        set_time_limit(0);
        // 获取网站
        $mothod = strtolower(Yii::$app->request->getMethod());
        $site_name = Yii::$app->request->$mothod('site_name');
        $process = Yii::$app->request->$mothod('process');
        $process = $process ? (int)$process : 1;
        if (!$site_name) {
            echo '必须要传网站名';
            exit;
        } 

        
        $lock = new FileLock("new_send_gb_review_sys_mail".$process);
       
        if($lock->tryLock() === false) {
//            $this->writeLog('action:SendGbUserMail;process:'.$process.';有请求在处理中，拒绝该请求！');
            echo 'action:NewSendGbReviewMail;process:'.$process.';有请求在处理中，拒绝该请求！';
            exit;
        }
        
        // 获取队列名称
        $queue_name = Yii::$app->params['sites']['sys_email']['web_config'][$site_name]['new_review_queue_name'];
        if(!$queue_name) {
            echo '队列不存在！';
            exit;
        }
        // 发送邮件
        $returnData = MqComponent::newSendGbMailSys($queue_name);
        
       //return $returnData;
        //var_dump($returnData);
       
        $msg = "site_name:$site_name,queue:$queue_name".PHP_EOL.($returnData ? var_export($returnData,true) : "");
        if($returnData) {
            $this->writeLog($msg);
        }
        echo $msg;
        
        
    }
    
}